<template>
	<view class="dropdown-item" v-if="active" @touchmove.stop.prevent="() => {}" @tap.stop.prevent="() => {}">
		<block v-if="!$slots.default && !$slots.$default">
			<scroll-view scroll-y="true" style="height:auto;">
				<view class="dropdown__options">
					<view class="dropdown__options_li" :class="{act:value == li.value}" @click="cellClick(li.value)"
						:style="{'--color':activeColor,'--dcolor':inactiveColor,'--size':n_size,'--width':n_width}"
						v-for="(li, i) in options" :key="i">{{li.label}}</view>
				</view>
			</scroll-view>
		</block>
		<slot v-else />
	</view>
</template>

<script>
	/**
	 * dropdown-item 下拉菜单
	 * @description 该组件一般用于向下展开菜单，同时可切换多个选项卡的场景
	 * @tutorial http://uviewui.com/components/dropdown.html 修改版
	 * @property {String | Number} v-model 双向绑定选项卡选择值
	 * @property {String} title 菜单项标题
	 * @property {Array[Object]} options 选项数据，如果传入了默认slot，此参数无效
	 * @property {Boolean} disabled 是否禁用此选项卡（默认false）
	 * @property {String | Number} duration 选项卡展开和收起的过渡时间，单位ms（默认300）
	 * @property {String | Number} height 弹窗下拉内容的高度(内容超出将会滚动)（默认auto）
	 * @example <com-dropdown-item title="标题"></com-dropdown-item>
	 */
	export default {
		name: 's-dropdown-item',
		props: {
			// 当前选中项的value值
			value: { type: [Number, String, Array],default: '' },
			// 菜单项标题
			title: { type: [String, Number],default: '' },
			type: { type: String,default: '' },// type=onlyclick时支持点击事件调用外部组件
			// 选项数据，如果传入了默认slot，此参数无效
			options: { type: Array,default () { return [] } },
			// 是否禁用此菜单项
			disabled: { type: Boolean,default: false },
		},
		data() {
			return {
				active: false, // 当前项是否处于展开状态
				activeColor: '#2979ff', // 激活时左边文字和右边对勾图标的颜色
				inactiveColor: '#333333', // 未激活时左边文字和右边对勾图标的颜色
			}
		},
		computed: {
			// 监听props是否发生了变化，有些值需要传递给父组件com-dropdown，无法双向绑定
			propsChange() { return `${this.title}-${this.disabled}`; },
			n_size() { return uni.upx2px(20)+'px'; },
			n_width() { return uni.upx2px(2)+'px'; },
		},
		watch: {
			propsChange(n) {
				// 当值变化时，通知父组件重新初始化，让父组件执行每个子组件的init()方法
				// 将所有子组件数据重新整理一遍
				if (this.parent) this.parent.init();
			}
		},
		created() {
			// 父组件的实例
			this.parent = false;
		},
		mounted() {
			this.init();
		},
		methods: {
			init() {
				// 获取父组件com-dropdown
				let parent = this.getParent.call(this, 's-dropdown');
				if (parent) {
					this.parent = parent;
					// 将子组件的激活颜色配置为父组件设置的激活和未激活时的颜色
					this.activeColor = parent.activeColor;
					this.inactiveColor = parent.inactiveColor;
					// 将本组件的this，放入到父组件的children数组中，让父组件可以操作本(子)组件的方法和属性
					// push进去前，显判断是否已经存在了本实例，因为在子组件内部数据变化时，会通过父组件重新初始化子组件
					let exist = parent.children.find(val => {
						return this === val;
					})
					if (!exist) parent.children.push(this);
					if (parent.children.length == 1) this.active = true;
					// 父组件无法监听children的变化，故将子组件的title，传入父组件的menuList数组中
					parent.menuList.push({
						title: this.title,
						type:this.type,
						disabled: this.disabled,
					});
				}
			},
			// cell被点击
			cellClick(value) {
				// 修改通过v-model绑定的值
				this.$emit('input', value);
				// 通知父组件(com-dropdown)收起菜单
				this.parent.close();
				// 发出事件，抛出当前勾选项的value
				this.$emit('change', value);
			},
			getParent(name = undefined) {
				let parent = this.$parent
				// 通过while历遍，这里主要是为了H5需要多层解析的问题
				while (parent) {
					// 父组件
					if (parent.$options && parent.$options.name !== name) {
						// 如果组件的name不相等，继续上一级寻找
						parent = parent.$parent
					} else {
						return parent
					}
				}
				return false
			}
		},
	}
</script>

<style scoped lang="scss">
	.dropdown{
		&__options{
			background: #fff;
			&_li{
				position: relative;
				display: flex;
				align-items: center;
				height: 90rpx;
				box-sizing: border-box;
				padding: 0 30rpx;
				color: var(--dcolor);
				font-size: 30rpx;
				border-bottom: 1px solid #f5f5f5;
				&.act{
					color: var(--color);
					&:before{
						display: block;
						position: absolute;
						content: '';
						width: var(--size);height: var(--size);
						border-color: var(--color);
						border-style: solid;
						border-width: 0 var(--width) var(--width) 0;
						transform: rotate(-45deg);
						box-sizing: border-box;
						transition-duration: .5s;
						right: 30rpx;
					}
				}
			}
		}
	}
</style>
